МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ ПІСЛЯДИПЛОМНОЇ ОСВІТИ (II-га В.О.)
/
ЛАБОРАТОРНА РОБОТА №2
з предмету: «Комп’ютерна графіка»
на тему:
«Фрактали»
Тема: Фрактали.
Мета: Ознайомитись на практиці із основними поняттями теорії фракталів, навчитись будувати різні фрактальні зображення та використовувати IFS, як простий засіб отримання фрактальних структур.
Теоретичні відомості
Умова завдання.
16
*Побудувати фрактал, який наведено на рис. 1
/
Рис. 1. Вигляд фракталу
Назва фракталу: Листок папороті.
Опис фракталу: Фрактал належить до класу стохастичних фракталів, які виходять в тому випадку, коли в ітераційному процесі випадковим чином міняти які-небудь його параметри. При цьому утворюються об’єкти дуже схожі на природні. Лист папороті - один з тих об'єктів, які зручно будувати за допомогою імовірнісних розподілів. Основна ідея цього методу полягає в тому, щоб, зафіксувавши початкову точку, далі циклічно здійснювати Афінні перетворення системи координат, в якій точка будується. Тобто, якщо на певному кроці циклу є точка точка А з координатами (х0, y0), то при наступній ітерації циклу зображується точка В, чиї координати мають вигляд (а * х0 + в * y0 + с, d * х0 + e * y0 + f ) . Таким чином спостерігається явне вираження "нової" системи координат (точка В) через "стару" (точка А). У свою чергу коефіцієнти перетворення систем координат вибираються залежно від попадання деякої випадкової величини у відповідний діапазон значень .У даному прикладі випадкова величина приймає значення з відрізка від 0 до 1.
Обрані наступні діапазони для цієї випадкової величини :
від 0 до 0.85 - відповідає перетворенню безлічі точок, що відповідають за "густоту" і " висоту" листа папороті .
від 0.85 до 0.92 - малює листочки зліва від стебла
від 0.92 до 0.99 - малює листочки праворуч від стебла
решта - зображення стебла
Алгоритм Ф:
Ф1: Початкові значення. Встановлюємо координати x := 1.0; y := 1.0; Лічильник циклу k := 1.
Ф2: Обчислення випадкового параметра. p := random; t := x;
Ф3: Афінні перетворення. Якщо p <= 0.85, то: x := 0.84 * x -0.045 * y; y := 0.045 * t + 0.86 * y + 1.6; Якщо p <= 0.92, то: x := 0.25 * x - 0.26 * y; y := 0.23 * t + 0.25 * y + 1.6; Якщо p <= 0.99, то: x := -0.135 * x + 0.28 * y; y := 0.26 * t + 0.245 * y + 0.44; Інакше: x := 0.0; y := 0.16 * y;
Ф4: Інкремент та перевірка лічильника. k := k + 1; Якщо k = iterations (задана к-сть кроків), то: завершення, інакше: перехід на крок Ф2.
Текст програми (середовище Delphi 7)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
grp1: TGroupBox;
paintbox1: TPaintBox;
LE1: TLabeledEdit;
StartX: TLabeledEdit;
StartY: TLabeledEdit;
stat1: TStatusBar;
btn2: TButton;
btn3: TButton;
msec: TLabeledEdit;
procedure btn1Click(Sender: TObject);
procedure draw();
procedure erase();
procedure info();
procedure FormCreate(Sender: TObject);
procedure StartYExit(Sender: TObject);
procedure StartXExit(Sender: TObject);
procedure LE1Exit(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure msecExit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
//максимальна кількість ітерацій
MAX_ITER = 100000;
var
//масиви координат точок
PixArrX, PixArrY: array[1..MAX_ITER] of Integer;
//поточний крок виконання фракталу
PixIndex: Integer;
//к-сть ітерацій, яку виконуємо за один раз
iterations: Integer;
{$R *.dfm}
//переведення тексту в число з врахуванням помилок вводу,
//а також перевірка на допустимі межі
function TextToInt(s: String; a,b,default: Integer): Integer;
var
str: string;
i: Integer;
begin
for i:= 1 to Length(s) do
begin
if...